[Update] Windows Defender Credential Guard รองรับการใช้งานใน EC2 แล้ว
บทความนี้ได้รับการแปลมาจากบทความภาษาญี่ปุ่นที่มีชื่อว่า [アップデート] EC2インスタンスでWindows Defender Credential Guardがサポートされました。 โดยเจ้าของบทความนี้คือ คุณ takuya ซึ่งเป็นชาวญี่ปุ่น และในบทความนี้จะมีการปรับสำนวนการเขียน รวมถึงมีการเรียบเรียงเนื้อหาใหม่ให้เข้าใจง่ายและมีความเหมาะสมมากยิ่งขึ้น
เมื่อวันที่ 31 มกราคม 2023 ที่ผ่านมา ทาง AWS ได้ประกาศออกมาว่า Windows Defender Credential Guard (จากนี้จะขอเรียกว่า Credential Guard) สามารถรองรับการใช้งานใน EC2 ได้แล้วครับ
ในบทความนี้ผมจะมาอธิบายรายละเอียดเกี่ยวกับเรื่องนี้ครับ
Credential Guard คืออะไร
Credential Guard คือหนึ่งในฟังก์ชันของ Virtualization-Based Security (VBS) ที่ถูกเพิ่มเข้ามาตั้งแต่ Windows10 / Windows Server 2016 เป็นต้นไปครับ
ซึ่งตัว VBS ก็ตามชื่อเลยครับ คือการใช้งานฟังก์ชันของ Hyper-V เพื่อรันคำสั่ง OS บางอย่างบน Kernel ภายในสภาพแวดล้อมที่ถูกแยกออกมาโดย Hypervisor (สภาพแวดล้อมนี่เรียกว่า Virtual Secure Mode หรือ VSM) ครับ
(ที่มารูปภาพ: https://techcommunity.microsoft.com/t5/windows-insider-program/virtualization-based-security-vbs-and-hypervisor-enforced-code/m-p/240571)
จากนั้น Credential Guard ก็จะทำการแยกตัว LSASS (Local Security Authority Server Service) ซึ่งเป็นระบบประมวลผลและจัดการข้อมูลสำหรับการยืนยันตัวตน ออกมาอยู่ในสภาพแวดล้อมปิด (เรียกว่า LSAIso) เพื่อป้องกันการโจมตีที่หวังจะเข้ามาขโมยข้อมูลที่ถูกเก็บไว้ในหน่วยความจำของ LSASS (Pass-the-Hash Attack) ครับ
(ที่มารูปภาพ: https://learn.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-how-it-works)
เงื่อนไขในการใช้งานบน AWS
ถึงแม้ Credential Guard จะเป็นฟังก์ชันมาตรฐานที่มีใน Windows OS ก็ตาม แต่ในการใช้งานฟังก์ชันนี้บน AWS จำเป็นจะต้องทำตามเงื่อนไขดังด้านล่างนี้ให้ครบด้วยครับ
- อ้างอิง : Credential Guard : Prerequisites
1. AMI ที่มีการเปิดใช้งาน NitroTPM และ UEFI Secure Boot
ในการใช้งาน Credential Guard บน AWS นั้น จำเป็นจะต้องใช้ AMI ที่มีการใช้งาน NitroTPM และ UEFI Secure Boot ครับ เนื่องจากโดยส่วนใหญ่แล้ว Windows Server AMI จะไม่มีการใช้งาน NitroTPM กับ UEFI Secure Boot จึงจำเป็นที่จะต้องเตรียม AMI ที่มีการใช้งานทั้งสองฟังก์ชันนี้โดยเฉพาะด้วยตนเองครับ
NitroTPM เป็น Virtual TPM Module ของทาง AWS ที่มีความเข้ากันได้กับ TPM 2.0 ส่วนรายละเอียดเพิ่มเติมสามารถดูได้ที่บล็อกด้านล่างนี้เลยครับ
นอกจากนี้ ณ ปัจจุบัน AMI ของทาง AWS ที่มีการใช้งาน NitroTPM จะมีชื่อเริ่มต้นด้วย TPM-Windows_Server
ตามด้านล่างนี้ครับ
- TPM-Windows_Server-2022-English-Full-Base
- TPM-Windows_Server-2022-English-Core-Base
- TPM-Windows_Server-2019-English-Full-Base
- TPM-Windows_Server-2019-English-Core-Base
- TPM-Windows_Server-2016-English-Full-Base
- TPM-Windows_Server-2016-English-Core-Base
ซึ่งมีแต่ OS เวอร์ชันภาษาอังกฤษครับ สามารถค้นหาผ่าน AWS CloudShell ได้ด้วยคำสั่งตามด้านล่างนี้ครับ
# กรณีที่ใช้ AWS CloudShell บน AWS Management Console
aws ec2 describe-images \
--filters 'Name=platform,Values=windows' 'Name=name,Values=TPM-Windows_Server-*' \
--query 'reverse(sort_by(Images, &CreationDate))[*].{ImageId:ImageId, Name:Name, Description:Description}' \
--output json | jq
ตัวอย่างการรันคำสั่ง
[cloudshell-user@ip-10-4-89-96 ~]$ aws ec2 describe-images \
> --filters 'Name=platform,Values=windows' 'Name=name,Values=TPM-Windows_Server-*' \
> --query 'reverse(sort_by(Images, &CreationDate))[*].{ImageId:ImageId, Name:Name, Description:Description}' \
> --output json | jq
[
# ・・・omission・・・
{
"ImageId": "ami-0b690ac64d4a7acf2",
"Name": "TPM-Windows_Server-2022-English-Full-Base-2023.05.10",
"Description": "Microsoft Windows Server 2022 Full Locale English with TPM 2.0 and Secure Boot support, AMI provided by Amazon"
},
{
"ImageId": "ami-08180e1b593691d07",
"Name": "TPM-Windows_Server-2022-English-Core-Base-2023.05.10",
"Description": "Microsoft Windows Server 2022 Core Locale English with TPM 2.0 and Secure Boot support, AMI provided by Amazon"
},
# ・・・omission・・・
เรายังสามารถเช็คว่า AMI นั้น ๆ มีการใช้งาน NitroTPM กับ UEFI Boot หรือไม่ ได้ด้วยครับ ด้วยคำสั่งดังด้านล่างนี้
# กรณีที่ใช้ AWS CloudShell บน AWS Management Console
aws ec2 describe-images --image-ids "[AMI ID]" \
--query "Images[].{Name:Name,BootMode:BootMode,TpmSupport:TpmSupport}" \
--output json | jq
ตัวอย่างการรันคำสั่ง
# หากมีการเปิดใช้งาน、TpmSupport, BootMode จะถูกตั้งค่าแยกกัน
[cloudshell-user@ip-10-2-20-161 ~]$ aws ec2 describe-images --image-ids ami-0b690ac64d4a7acf2 ami-08180e1b593691d07 \
> --query "Images[].{Name:Name,BootMode:BootMode,TpmSupport:TpmSupport}" \
> --output json | jq
[
{
"Name": "TPM-Windows_Server-2022-English-Core-Base-2023.05.10",
"BootMode": "uefi",
"TpmSupport": "v2.0"
},
{
"Name": "TPM-Windows_Server-2022-English-Full-Base-2023.05.10",
"BootMode": "uefi",
"TpmSupport": "v2.0"
}
]
2. Instance Type
Credential Guard รองรับการใช้งานใน Instance type บางประเภทเท่านั้นครับ รายละเอียดเป็นไปตามที่เขียนไว้ในเอกสารที่ได้ให้ไว้ก่อนหน้าเลยครับ แต่ถ้าให้พูดกว้าง ๆ ก็คือ จะมีแค่ Instance type C, M, R ตั้งแต่ Gen 5 ขึ้นไปเท่านั้นที่สามารถใช้งาน Nitro ได้ครับ
ในที่นี้จะขอเขียนระบุแค่ Instance type ที่ใช้ได้เท่านั้นครับ (ไม่ระบุขนาด)
- C5, C5d, C5n
- C6i, C6id
- M5, M5d, M5dn, M5n, M5zn
- M6i, M6id, M6in
- R5, R5b, R5d, R5dn, R5n
- R6i, R6id, R6in
นอกจากนี้ Instance type ที่รองรับการใช้งาน NitroTPM นั้นจะแตกต่างกับ Instance type ที่รองรับการใช้งาน Nitro Gen 5 เล็กน้อย ตรงจุดนี้ต้องระมัดระวังกันด้วยนะครับ
(และใน Instance type ที่รองรับการใช้งาน NitroTPM จะมีแค่ส่วนหนึ่งเท่านั้นที่รองรับการใช้งาน Credential Guard ด้วย)
3. OS
Credential Guard ถูกนำเข้ามาใช้งานตั้งแต่ Windows Server 2016 เป็นต้นไป ในการใช้งานจึงจำเป็นต้องใช้ OS Windows Server 2016 ขึ้นไปครับ
AMI ที่มีการใช้งาน TPM ที่ทาง AWS เตรียมไว้ให้นั้น มี OS ที่ใหม่กว่า Windows Server 2016 ขึ้นไปทั้งหมด เพราะฉะนั้นไม่จำเป็นต้องคิดอะไรมากเลยครับ แต่สำหรับท่านที่สร้าง AMI ที่มีการใช้งาน TPM ขึ้นมาเองนั้นคงต้องจำจุดนี้ไว้ให้ขึ้นใจเลยครับ
ทดลองใช้งาน
จากนี้เราก็จะมาเริ่มลองใช้งานกันดูครับ
ผมได้ทำการเตรียม EC2 instance ที่สามารถใช้งาน NitroTPM ได้ สำหรับใช้ในการทดลองครั้งนี้ไว้ใน AWS Account ซึ่งอยู่ใน Singapore Region ครับ โดยรายละเอียดของ AMI และ Instance type เป็นไปตามด้านล่างนี้ครับ
- AMI : ami-0bf7cfb3ec5342914 (TPM-Windows_Server-2022-English-Full-Base-2023.05.10)
- Instance type : m6i.large
ในที่นี้ผมจะขออนุญาตละขั้นตอนในการสร้างตัว EC2 instance ออกไปครับ
(สำหรับท่านที่ยังไม่ทราบขั้นตอนในการสร้าง EC2 ทาง Classmethod ได้เขียนบล็อกสอนวิธีการสร้างเอาไว้อยู่ สามารถศึกษาได้ที่บล็อกนี้เลยครับ)
โดยในส่วนของการเลือก AMI สามารถเลือกผ่านเมนู AMI Catalog ที่อยู่ในแถบเมนูด้านซ้ายในหน้าของ EC2 Console ได้ ซึ่งจะสะดวกกว่าการค้นหาตรง ๆ ในระหว่างที่สร้าง EC2 ครับ โดยจะมีขั้นตอนตามนี้
- ที่บริเวณแถบเมนูด้านซ้าย เลือก
AMI Catalog
- พิมพ์
tpm 2022
ลงในช่องค้นหา - เลือก
Community AMIs
- ในส่วนของ Refine results เลือก
All Windows
- คลิก
Select
เลือก AMI ที่ต้องการ (ในที่นี้คือ ami-0bf7cfb3ec5342914 (TPM-Windows_Server-2022-English-Full-Base-2023.05.10)) - คลิก
Launch Instance with AMI
หลังจากสร้าง instance เรียบร้อย ให้ทำการเชื่อมต่อเข้าไปใน instance โดยใช้ไฟล์ RDP
และหลังจากที่ทำการเชื่อมต่อเข้าไปยัง instance ดังกล่าวเรียบร้อยแล้ว ขั้นตอนต่อจากนี้จะดำเนินการภายใน instance นั้นครับ
ตรวจสอบ NitroTPM
ก่อนอื่นเปิดใช้งานตัวจัดการ TPM tpm.msc
ขึ้นมา (กดปุ่ม Windows
+R
แล้วพิมพ์ tpm.msc
หากไม่มีอะไรเกิดขึ้นแปลว่า instance นั้นไม่รองรับ TPM) แล้วเช็คดูว่ามีการใช้งาน NitroTPM อยู่หรือเปล่า
ถ้าในช่อง「TPM Manufacturer Information」มีคำว่า「Manufacturer Name: AMZN」ปรากฏขึ้นมาก็ถือว่าเป็นอันใช้ได้ครับ
ในกรณีที่ไม่มีการใช้งาน NitroTPM อยู่ โปรแกรมจะแสดงว่า「Compatible TPM cannot be found」ครับ
เปิดใช้งาน Credential Guard
Credential Guard สามารถเปิดใช้งานได้หลายวิธีครับ และเนื่องจากวิธีที่เขียนไว้ใน AWS Document คือการใช้ Group Policy เพราะฉะนั้นในบล็อกนี้ผมจะใช้วิธีนี้เช่นเดียวกันครับ
เนื่องจากสภาพแวดล้อมในครั้งนี้คือ Workgroup Environment เราจึงจะใช้งานตัว Local Group Policy Editor ครับ ที่ทางด้านซ้ายของ Editor ให้เลือก「Computer Configuration」→「Administrative Templates」→「System」→「Device Guard」แล้วเลือก「Turn On Virtualization Based Security」เพื่อตั้งค่า policy ครับ
ใน policy นี้ ที่หัวข้อ「Select Platform Security Level」ให้เลือก Secure Boot and DMA Protection
และที่หัวข้อ「Credential Guard Configuration」ให้เลือก Enabled without lock
ครับ
หลักจากที่ตั้งค่าเสร็จแล้วก็ให้ทำการ restart server ครับ
เท่านี้ก็ถือว่าเปิดใช้งานเรียบร้อยครับ
นอกจากนี้ หากเราเลือกเปิดใช้งาน Credential Guard โดยวิธี Group Policy เราไม่จำเป็นต้องไปทำการเปิดใช้งาน「Hyper-V function」เลยครับ แค่ตั้งค่า Policy ก็เพียงพอแล้ว
ตรวจสอบ Credential Guard
หลังจากทำการ restart แล้ว Credential Guard ก็จะถูกเปิดใช้งานครับ
หากเปิดโปรแกรม System Information (msinfo32.exe
) ก็จะสามารถตรวจสอบสถานะการตั้งค่าของ Credential Guard ได้ครับ
ในเมนู「System Summary」หากมีรายละเอียดเป็นไปตามภาพด้านล่างก็ถือว่า Credential Guard ถูกเปิดใช้งานเรียบร้อยแล้วครับ
ส่วนที่ควรเช็คเป็นพิเศษคือ Virtualization-based security = Running、Virtualization-based
และ security Services Running = Credential Guard
ครับ
และในกรณีที่ Credential Guard ไม่ได้เปิดใช้งานอยู่ จะแสดงแค่ Virtualization-based security = Not enabled
เพียงอย่างเดียวครับ
(กรณีที่ทั้ง VBS และ Credential Guard ไม่ได้เปิดใช้งาน)
นอกเรื่อง : Pass-the-Challenge
นี่เป็นสิ่งที่ผมได้ทราบขณะที่กำลังเขียนบล็อกนี้อยู่ครับ ว่ามีวิธีการโจมตีรูปแบบใหม่ที่สามารถหลบหลีกตัว Credential Guard ได้ (Pass-the-Challenge) ถูกปล่อยออกมาอยู่ครับ ส่วนรายละเอียดนั้นสามารถอ่านเพิ่มเติมได้ที่บทความด้านล่างนี้เลยครับ
ตัวผมก็ไม่ใช่ผู้เชี่ยวชาญด้าน security จึงพูดอะไรไม่ได้มากนักครับ แต่ผมคิดว่าถึงแม้จะมี Credential Guard อยู่ ก็อย่าชะล่าใจน่าจะดีกว่าครับ และเพราะว่า Pass-the-Challenge จะพุ่งเป้าไปแค่ที่ NTLM hash เพียงอย่างเดียว[*1] การจะบอกว่า "แค่การตั้งค่า Credential Guard เพียงอย่างเดียวนั้นไม่มีประโยชน์อะไร" ก็คงพูดได้ยากเหมือนกันครับ
สุดท้ายนี้
บล็อกนี้จบลงเพียงเท่านี้ครับ
อาจต้องคิดหลายตลบก่อนจะนำ Credential Guard มาใช้ แต่ก็มีบางกรณีที่ควรค่าแก่การนำเข้ามาใช้ไม่ใช่เหรอครับ
เมื่อมีการใช้งาน NitroTPM จะทำให้มีข้อจำกัดในการสร้าง AMI หรือการสร้าง/restore EBS snapshot ครับ ตรงจุดนี้ก็ขอให้ระวังกันด้วยนะครับ
เชิงอรรถ
[*1] โดยพื้นฐานแล้วหากพูดถึง NTLMv1, v2 นั่นหมายความว่า Kerberos ticket ก็ตกเป็นเป้าหมายด้วยหรือเปล่าผมก็ไม่ทราบครับ
บทความที่เกี่ยวข้อง
- [アップデート] EC2インスタンスでWindows Defender Credential Guardがサポートされました (บทความต้นฉบับ)